#include "include/muduo/net/TcpServer.h"
#include "include/muduo/net/TcpConnection.h"
#include "include/muduo/net/EventLoop.h"

#include <iostream>
#include <functional>
#include <unordered_map>

// 翻译服务器类，基于muduo网络库实现
class TranslateServer
{
public:
    // 构造函数，初始化服务器并绑定回调函数
    TranslateServer(int port) : 
        _server(&_baseloop, muduo::net::InetAddress("0.0.0.0", port), "TranslateServer", muduo::net::TcpServer::kReusePort)
    {
        // 当服务器检测到连接建立或断开时，自动调用指定的回调函数（这里是 onConnection 方法）。
        auto func1 = std::bind(&TranslateServer::onConnection, this, std::placeholders::_1);
        _server.setConnectionCallback(func1);
        
        // 绑定消息到达时的回调函数
        auto func2 = std::bind(&TranslateServer::onMessage, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
        _server.setMessageCallback(func2);
    }
    
    // 启动服务器，开始监听连接
    void start()
    {
        _server.start();      // 启动服务器
        _baseloop.loop();     // 进入事件循环，开始处理网络事件
    }

private:
    // 连接建立/断开时的回调函数
    void onConnection(const muduo::net::TcpConnectionPtr &conn)
    {
        if (conn->connected() == true)
        {
            std::cout << "新连接建立成功！客户端地址: " 
                      << conn->peerAddress().toIpPort() << "\n";
        }
        else
        {
            std::cout << "连接关闭！客户端地址: " 
                      << conn->peerAddress().toIpPort() << "\n";
        }
    }
    
    // 翻译函数，将中文翻译成英文
    std::string translate(const std::string &str)
    {
        // 内置的翻译字典
        std::unordered_map<std::string, std::string> dict_map =
            {
                // 日常用语
                {"你好", "Hello"},
                {"再见", "Goodbye"},
                {"谢谢", "Thank you"},
                {"对不起", "Sorry"},
                {"请", "Please"},
                {"是", "Yes"},
                {"否", "No"},
            };
            
        // 在字典中查找翻译结果
        auto it = dict_map.find(str);
        if (it != dict_map.end())
        {
            return it->second; // 找到匹配项，返回对应翻译
        }
        
        return "未找到翻译"; // 未找到匹配项，返回默认提示
    }
    
    // 消息处理回调函数，当客户端发送消息时被调用
    void onMessage(const muduo::net::TcpConnectionPtr &conn, muduo::net::Buffer *buf, muduo::Timestamp)
    {
        // 从缓冲区读取客户端发送的所有数据
        std::string str = buf->retrieveAllAsString();
        
        // 进行翻译
        std::string resp = translate(str);
        
        // 将翻译结果返回给客户端
        conn->send(resp);
    }

private:
    muduo::net::TcpServer _server;  // TCP服务器对象
    muduo::net::EventLoop _baseloop; // 事件循环对象
};

int main()
{
    // 创建翻译服务器实例，监听8085端口
    TranslateServer server(8085);
    
    // 启动服务器
    server.start();
    
    return 0;
}